#ifndef _POINT_H
#define _POINT_H

#include<assert.h>

// =============================================================================
//  Déclaration de la classe Point
// =============================================================================

template<int t_iDimPoint, typename t_Type>
class Point
{
	public:
		Point();
		Point(t_Type p_tCoordonates[t_iDimPoint]);
		~Point() {}
		
		t_Type GetCoordonate(int p_iRange);
		void SetCoordonate(int p_iRange, t_Type p_tCoord);
		
	private:
		t_Type m_tCoordonates[t_iDimPoint];
};

// =============================================================================
//  Implantation des fonctions membres.
// =============================================================================

template<int t_iDimPoint, typename t_Type>
Point<t_iDimPoint, t_Type>::Point()
{
	for(int i = 0; i < t_iDimPoint; i++)
		m_tCoordonates[i] = 0; 
}

// -----------------------------------------------------------------------------
template<int t_iDimPoint, typename t_Type>
Point<t_iDimPoint, t_Type>::Point(t_Type p_tCoordonates[t_iDimPoint])
{
	for(int i = 0; i < t_iDimPoint; i++)
		m_tCoordonates[i] = p_tCoordonates[i];
}

// -----------------------------------------------------------------------------
template<int t_iDimPoint, typename t_Type>
t_Type Point<t_iDimPoint, t_Type>::GetCoordonate(int p_iRange)
{
	assert(p_iRange >= 0 && p_iRange < t_iDimPoint);
	return m_tCoordonates[p_iRange];
}

// -----------------------------------------------------------------------------
template<int t_iDimPoint, typename t_Type>
void Point<t_iDimPoint, t_Type>::SetCoordonate(int p_iRange, t_Type p_tCoord)
{
	assert(p_iRange >= 0 && p_iRange < t_iDimPoint);
	m_tCoordonates[p_iRange] = p_tCoord;
}

#endif // _POINT_H
